package com.gradumate.shared;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.RootPanel;
import com.gradumate.client.Element;
import com.gradumate.client.gui.AfstudeercommissieAfstudeerVoorstelLijst;
import com.gradumate.client.gui.GebruikerHome;
import com.gradumate.client.gui.GebruikerInstelling;
import com.gradumate.client.gui.GebruikerSelectie;
import com.gradumate.client.gui.StudentToegangVerlenen;
import com.gradumate.client.gui.StudieAdviseurAfstudeerVerzoekLijst;

/**
 * MenuFactory maakt en toont het menu
 * @author Hugo Zonderland
 */

public class MenuFactory {

	// Logger
	private Logger log = Logger.getLogger(MenuFactory.class.toString());

	// Element classe voor het aanmaken van Buttons e.d
	private Element element = new Element();

	/**
	 * Maakt de MenuItems aan
	 * 
	 * @return ArrayList<MenuItem> met MenuItems
	 */
	public ArrayList<MenuItem> getMenuItems() {

		ArrayList<MenuItem> menuItems = new ArrayList<MenuItem>();

		/**
		 * GebruikerSelectie
		 */
		// Command voor GebruikerSelectie
		Command cGebruikerSelectie = new Command() {
			public void execute() {
				new GebruikerSelectie();
			}
		};

		// MenuItem aanmaken
		MenuItem mGebruikerSelectie = new MenuItem("Gebruiker selectie",
				cGebruikerSelectie);

		// Image die gebruikt word op de menuknop
		Image imgGebruikerSelectie = element.getImage("GebruikerSelectie",
				"group.png");
		mGebruikerSelectie.setImg(imgGebruikerSelectie);

		// Rechten bijbehorende aan het menuitem
		mGebruikerSelectie.addType(Gebruiker.TYPE_AFSTUDEER_ADMINISTRATIE);
		mGebruikerSelectie.addType(Gebruiker.TYPE_AFSTUDEER_COORDINATOR);
		mGebruikerSelectie.addType(Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER);
		mGebruikerSelectie.addType(Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID);
		mGebruikerSelectie.addType(Gebruiker.TYPE_STUDENT);
		mGebruikerSelectie.addType(Gebruiker.TYPE_STUDIE_ADVISEUR);
		mGebruikerSelectie.addType(Gebruiker.TYPE_TEAMLEIDER_PERSONEELSZAKEN);

		// toevoegen aan array
		menuItems.add(mGebruikerSelectie);

		/**
		 * GebruikerHome
		 */
		// Command voor GebruikerHome
		Command cGebruikerHome = new Command() {
			public void execute() {
				new GebruikerHome();
			}
		};

		// Menu Item aanmaken
		MenuItem mGebruikerHome = new MenuItem("Gebruiker home", cGebruikerHome);

		// Image die gebruikt word op de menuknop
		Image imgGebruikerHome = element.getImage("Gebruiker home", "house.png");
		mGebruikerHome.setImg(imgGebruikerHome);

		// Rechten bijbehorende aan het menuitem
		mGebruikerHome.addType(Gebruiker.TYPE_AFSTUDEER_ADMINISTRATIE);
		mGebruikerHome.addType(Gebruiker.TYPE_AFSTUDEER_COORDINATOR);
		mGebruikerHome.addType(Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER);
		mGebruikerHome.addType(Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID);
		mGebruikerHome.addType(Gebruiker.TYPE_STUDIE_ADVISEUR);
		mGebruikerHome.addType(Gebruiker.TYPE_TEAMLEIDER_PERSONEELSZAKEN);

		// Toevoegen aan array
		menuItems.add(mGebruikerHome);
		
		/**
		 * GebruikerHome
		 */
		// Command voor GebruikerHome
		Command cGebruikerInstelling = new Command() {
			public void execute() {
				new GebruikerInstelling();
			}
		};

		// Menu Item aanmaken
		MenuItem mGebruikerInstelling = new MenuItem("Gebruiker Instelling", cGebruikerInstelling);

		// Image die gebruikt word op de menuknop
		Image imgGebruikerInstelling = element.getImage("Gebruiker instelling", "cog.png");
		mGebruikerInstelling.setImg(imgGebruikerInstelling);

		// Rechten bijbehorende aan het menuitem
		mGebruikerInstelling.addType(Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER);
		mGebruikerInstelling.addType(Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID);
		mGebruikerInstelling.addType(Gebruiker.TYPE_STUDIE_ADVISEUR);

		// Toevoegen aan array
		menuItems.add(mGebruikerInstelling);

		/**
		 * StudentToegangVerlenen
		 */
		// Command voor ToegangVerlenen
		Command cToegangVerlenen = new Command() {
			public void execute() {
				new StudentToegangVerlenen();
			}
		};

		// MenuItem
		MenuItem mToegangVerlenen = new MenuItem("Toegang verlenen",
				cToegangVerlenen);

		// Image die gebruikt word op de menuknop
		Image imgToegangVerlenen = element
				.getImage("Toegang verlenen", "key_add.png");
		mToegangVerlenen.setImg(imgToegangVerlenen);

		// Rechten bijbehorende aan het menuitem
		mToegangVerlenen.addType(Gebruiker.TYPE_AFSTUDEER_ADMINISTRATIE);

		// Toevoegen aan array
		menuItems.add(mToegangVerlenen);

		/**
		 * Overzichtlijst nog te beoordelen voorstellen
		 */
		// Command voor OverzichtsLijstAfstudeerVerzoeken
		Command cOverzichtsLijstAfstudeerVerzoeken = new Command() {
			public void execute() {
				new StudieAdviseurAfstudeerVerzoekLijst();
			}
		};

		// MenuItem
		MenuItem mOverzichtsLijstAfstudeerVerzoeken = new MenuItem("Onbeoordeelde afstudeerverzoeken",
				cOverzichtsLijstAfstudeerVerzoeken);

		// Image die gebruikt word op de menuknop
		Image imgOverzichtslijstAfstudeerVerzoeken = element
				.getImage("Overzichtslijst afstudeer verzoeken", "application_view_list.png");
		mOverzichtsLijstAfstudeerVerzoeken.setImg(imgOverzichtslijstAfstudeerVerzoeken);

		// Rechten bijbehorende aan het menuitem
		mOverzichtsLijstAfstudeerVerzoeken.addType(Gebruiker.TYPE_STUDIE_ADVISEUR);

		// Toevoegen aan array
		menuItems.add(mOverzichtsLijstAfstudeerVerzoeken);
		
		/**
		 * Overzichtlijst nog te beoordelen voorstellen
		 */
		// Command voor OverzichtsLijstAfstudeerVoorstellen
		Command cOverzichtslijstAfstudeerVoorstellen = new Command() {
			public void execute() {
				new AfstudeercommissieAfstudeerVoorstelLijst();
			}
		};

		// MenuItem
		MenuItem mOverzichtsLijstAfstudeerVoorstellen = new MenuItem("Onbeoordeelde afstudeervoorstellen",
				cOverzichtslijstAfstudeerVoorstellen);

		// Image die gebruikt word op de menuknop
		Image imgOverzichtslijstAfstudeerVoorstellen = element.getImage("Overzichtslijst afstudeer voorstellen", "application_view_list.png");
		mOverzichtsLijstAfstudeerVoorstellen.setImg(imgOverzichtslijstAfstudeerVoorstellen);

		// Rechten bijbehorende aan het menuitem
		mOverzichtsLijstAfstudeerVoorstellen.addType(Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID);
		mOverzichtsLijstAfstudeerVoorstellen.addType(Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER);

		// Toevoegen aan array
		menuItems.add(mOverzichtsLijstAfstudeerVoorstellen);
		
		// Gemaakte MenuItems returnen
		return menuItems;
	}

	/**
	 * Returns the MenuBar.
	 */
	public void refreshMenuBar(Gebruiker g) {
		if (g != null) {

			log.info("Menu aanmaken voor Gebruiker: " + g.getGebruikerEmail());

			// Nieuw menubar object aanmaken
			MenuBar menuBar = new MenuBar(false);

			// MenuFactory aanroepen en de MenuItems laten genereren
			MenuFactory mf = new MenuFactory();
			ArrayList<MenuItem> menuItems = mf.getMenuItems();

			// Door de MenuItems heenlopen
			for (MenuItem mi : menuItems) {
				// Bepalen of de huidige gebruiker rechten heeft
				if (mi.allowed(g.getType())) {
					// Image van het menuitem aanmaken en omzetten naar HTML
					HTML img = new HTML();
					img.setHTML(mi.getImg().toString());
					// Toevoegen aan de MenuBar
					menuBar.addItem(mi.getTitle() + " " + img.getHTML(), true,
							mi.getCmd());
				}
			}
			// MenuBar in de Menu div plaatsen
			RootPanel.get("menu").add(menuBar);
		}
	}
}
